"""
查询 字段
"""

from fastapi import Query
from pydantic_core import PydanticUndefined

from my_typing import *


def QueryNormalField(  # noqa: ignore[func name]
    default: Any = PydanticUndefined,
    *,
    default_factory: CallableAny | None = PydanticUndefined,
    title: StrOrNone = None,
    description: StrOrNone = None,
    examples: ListOrNone = None,
    **kwargs,
) -> Any:
    """
    查询 普通字段

    Args:
        default: 默认值，省略号（...）表示该字段是必填的
        default_factory: 设置动态默认值，不可与 default 同时使用
        title: 标题
        description: 描述
        examples: 示例

    Returns:
        查询 普通字段
    """

    return Query(
        default,
        default_factory=default_factory,
        title=title,
        description=description or title,
        examples=examples,
        **kwargs,
    )


def QueryCharField(  # noqa: ignore[func name]
    default: Any = PydanticUndefined,
    *,
    default_factory: CallableAny | None = PydanticUndefined,
    title: StrOrNone = None,
    description: StrOrNone = None,
    min_length: IntOrNone = None,
    max_length: IntOrNone = None,
    regex: StrOrNone = None,
    examples: ListOrNone = None,
    **kwargs,
) -> Any:
    """
    查询 字符串字段

    Args:
        default: 默认值，省略号（...）表示该字段是必填的
        default_factory: 设置动态默认值，不可与 default 同时使用
        title: 标题
        description: 描述
        min_length: 最小长度
        max_length: 最大长度
        regex: 正则表达式
        examples: 示例

    Returns:
        查询 字符串字段
    """

    return Query(
        default,
        default_factory=default_factory,
        title=title,
        description=description or title,
        min_length=min_length,
        max_length=max_length,
        regex=regex,
        examples=examples,
        **kwargs,
    )


def QueryDecimalField(  # noqa: ignore[func name]
    default: Any = PydanticUndefined,
    *,
    default_factory: CallableAny | None = PydanticUndefined,
    title: StrOrNone = None,
    description: StrOrNone = None,
    min_value: FloatOrNone = None,
    max_value: FloatOrNone = None,
    max_digits: IntOrNone = None,
    decimal_places: IntOrNone = None,
    examples: ListOrNone = None,
    **kwargs,
) -> Any:
    """
    查询 小数字段

    Args:
        default: 默认值，省略号（...）表示该字段是必填的
        default_factory: 设置动态默认值，不可与 default 同时使用
        title: 标题
        description: 描述
        min_value: 最小值
        max_value: 最大值
        max_digits: 数字的最大位数
        decimal_places: 小数点后的最大位数
        examples: 示例

    Returns:
        查询 小数字段
    """

    return Query(
        default,
        default_factory=default_factory,
        title=title,
        description=description or title,
        ge=min_value,
        le=max_value,
        max_digits=max_digits,
        decimal_places=decimal_places,
        examples=examples,
        **kwargs,
    )


def QueryIntegerField(  # noqa: ignore[func name]
    default: Any = PydanticUndefined,
    *,
    default_factory: CallableAny | None = PydanticUndefined,
    title: StrOrNone = None,
    description: StrOrNone = None,
    min_value: FloatOrNone = None,
    max_value: FloatOrNone = None,
    examples: ListOrNone = None,
    **kwargs,
) -> Any:
    """
    查询 整数字段

    Args:
        default: 默认值，省略号（...）表示该字段是必填的
        default_factory: 设置动态默认值，不可与 default 同时使用
        title: 标题
        description: 描述
        min_value: 最小值
        max_value: 最大值
        examples: 示例

    Returns:
        查询 整数字段
    """

    return Query(
        default,
        default_factory=default_factory,
        title=title,
        description=description or title,
        ge=min_value,
        le=max_value,
        examples=examples,
        **kwargs,
    )


def QueryListField(  # noqa: ignore[func name]
    default: Any = PydanticUndefined,
    *,
    default_factory: CallableAny | None = PydanticUndefined,
    title: StrOrNone = None,
    description: StrOrNone = None,
    min_length: IntOrNone = None,
    max_length: IntOrNone = None,
    unique: BoolOrNone = None,
    examples: ListOrNone = None,
    **kwargs,
) -> Any:
    """
    查询 列表字段

    Args:
        default: 默认值，省略号（...）表示该字段是必填的
        default_factory: 设置动态默认值，不可与 default 同时使用
        title: 标题
        description: 描述
        min_length: 列表的最小长度
        max_length: 列表的最大长度
        unique: 校验列表中的元素是否唯一（列表元素是否可以重复）
        examples: 示例

    Returns:
        查询 列表字段
    """

    return Query(
        default,
        default_factory=default_factory,
        title=title,
        description=description or title,
        min_items=min_length,
        max_items=max_length,
        unique_items=unique,
        examples=examples,
        **kwargs,
    )
